﻿namespace Journey.Security
{
    using Journey.Domain;
    using System;
    using System.Collections.Generic;
    using System.Linq;

    /// <summary>
    /// 角色信息。
    /// </summary>
    public class Role : EntityBase
    {
        /// <summary>
        /// 名称。
        /// </summary>
        private string _name = string.Empty;

        /// <summary>
        /// 显示名称。
        /// </summary>
        private string _displayName = string.Empty;

        /// <summary>
        /// 名称。
        /// </summary>
        public string Name
        {
            get
            {
                return this._name;
            }
            set
            {
                if (string.IsNullOrWhiteSpace(value))
                {
                    throw new ArgumentNullException("value", "角色名不可以是空的。");
                }

                if (!UserValidator.Current.IsChar(value))
                {
                    throw new ArgumentException("角色名只可以是字符。", "value");
                }

                this._name = value;
            }
        }

        /// <summary>
        /// 显示名称。
        /// </summary>
        public string DisplayName
        {
            get
            {
                return this._displayName;
            }
            set
            {
                if (string.IsNullOrWhiteSpace(value))
                {
                    throw new ArgumentNullException("value", "角色显示名称不可以是空的。");
                }

                if (!UserValidator.Current.IsChar(value))
                {
                    throw new ArgumentException("角色显示名称只可以是字符。", "value");
                }

                this._displayName = value;
            }
        }

        /// <summary>
        /// 角色图片。
        /// </summary>
        public string Photo { get; set; }

        /// <summary>
        /// 角色类型。
        /// </summary>
        public RoleType Type { get; set; }

        /// <summary>
        /// 权限集合。
        /// </summary>
        public ICollection<Permission> Permissions { get; private set; }

        /// <summary>
        /// 判断当前角色是否拥有指定权限。
        /// </summary>
        /// <param name="permissionName">权限名称。</param>
        /// <returns>如果当前角色拥有该权限，则为 true；否则为 false。</returns>
        public bool IsInPower(string permissionName)
        {
            return this.Permissions.Any(permission => permission.Name == permissionName);
        }

        /// <summary>
        /// 判断当前角色是否拥有指定权限。
        /// </summary>
        /// <param name="permission">权限信息。</param>
        /// <returns>如果当前角色拥有该权限，则为 true；否则为 false。</returns>
        public bool IsInPower(Permission permission)
        {
            return this.Permissions.Any(p => p.Id == permission.Id);
        }

        /// <summary>
        /// 设置角色拥有的权限。
        /// </summary>
        /// <param name="permissions">权限集合。</param>
        public void SetPermissions(ICollection<Permission> permissions)
        {
            this.Permissions = permissions;
        }

        /// <summary>
        /// 获得角色类型描述文字。
        /// </summary>
        /// <returns>角色类型描述文字。</returns>
        public string GetRoleType()
        {
            switch (this.Type)
            {
                case RoleType.Normal:
                    return "普通";

                case RoleType.Admin:
                    return "管理";

                case RoleType.System:
                    return "系统";

                default:
                    return string.Empty;
            }
        }

        /// <summary>
        /// 获得角色图片。
        /// </summary>
        /// <returns>角色图片地址。</returns>
        public string GetPhoto()
        {
            return string.Empty;
        }
    }
}